/**
 * 
 */
package sources;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import oracle.sql.CHAR;

import com.google.common.io.Files;
import com.google.common.io.LineProcessor;

import constrain.Constraint;

/**
 * @author Kyniek
 * 
 * Wczytuje dane z pliku do listy wartości, które w pliku muszą być umieszczone w jednej kolumnie. 
 * Separatorem wartości w pliku jest znak nowej linii
 * Wartości ze źródła są zwracane albo cyklicznie po kolei, albo losowo - określa to specjalny enum.
 *
 */
public class SimpleFileSource extends SimpleSource
{
//	enum Ordered {NATURAL, RANDOM };
//	
//	
//	Ordered order = Ordered.NATURAL;
//	
//	//nazwa pliku z którego źródło ma czytać
//	private String fileName;
//	
//	//nazwa źródła, będąca nazwą kolumny również
//	private String name;
//	
//	//typ danych dostarczanych przez źródło - odnosi się do bazy danych bo każdy element źródła jest zawsze stringiem
//	private String type;
//	
//	
//	private List<Constraint> con = new ArrayList<Constraint>();
//	
//	private List<String> rows;
//	
//	private String id;
//	
//	int current = 0;
	
	public SimpleFileSource(String fileName, String name, String type)
	{
		this(fileName, name, type, Order.NATURAL);
	}
	
	

	public SimpleFileSource(String fileName, String name, String type, Order ord)
	{
		super(null, name, type, ord);		

		try
		{
			this.data = Files.readLines(new File(fileName),Charset.forName("UTF-8"), new LineProcessor<List<Object>>() 
			{
				List<Object> result = new ArrayList<Object>();

				boolean firstLine = true;
				
				@Override
				public List<Object> getResult()
				{
					return result;
				}
	
				@Override
				public boolean processLine(String arg0) throws IOException
				{					
					if(firstLine)
					{
						String[] tab = arg0.split("\\s");
//						System.out.println(tab.length);
//						for(String s : tab)
//						{
//							System.out.println("- " + s);
//						}
						
						
						//System.out.println(arg0);
						firstLine = false;
						char[] strs = arg0.toCharArray();
						arg0 = "";
						for(Character ch : strs)
						{
							//System.out.println("___" + ch + ":" + Character.getNumericValue(ch) );
							if(Character.getNumericValue(ch) >= 0)
							{
								arg0 += ch;
							}
							else if (arg0.length() > 0)
							{
								arg0 += " ";
							}
						}
					}
					result.add(arg0);
					return true;
				}
		} );
		} catch (IOException e)
		{
			e.printStackTrace();
			data = new ArrayList<Object>();
		}
	}

	
//	@Override
//	public void setDataType(String typeName)
//	{
//		type = typeName;		
//	}
//	
//	
//	@Override
//	public String getDataType()
//	{
//		return type;
//	}
//
//	@Override
//	public void setName(String name)
//	{		
//		this.name = name;
//	}
//
//	@Override
//	public void setUniqueName(String name)
//	{
//		id = name;
//	}
//
//	@Override
//	public Object get()
//	{
//		String val = "";
//		
//		switch (order)
//		{
//			case RANDOM:
//				val = rows.get(  (int)(Math.random() * rows.size() ) );
//				break;
//			default : 
//				if(current >= rows.size())
//				{
//					current = 0;
//				}
//				val = rows.get(current);
//				current++;
//				break;
//			
//		}
//		return val;
//	}
//
//	@Override
//	public String getName()
//	{
//		return name;
//	}
//
//	@Override
//	public String getUniqueName()
//	{
//		return id;
//	}
//
//	@Override
//	public Object[] get(int dataSize)
//	{
//		Object res[] = new Object[dataSize];
//		for(int i = 0; i < res.length; i++)
//		{
//			res[i] = get();
//		}
//		return res;
//	}
//
//	public Ordered getOrder()
//	{
//		return order;
//	}
//
//	public void setOrder(Ordered order)
//	{
//		this.order = order;
//	}
//
//
//	@Override
//	public String generateDeclaration()
//	{
//		// TODO Auto-generated method stub
//		return name + " " + type;
//	}
//
//
//	@Override
//	public void setConstraint(Constraint con)
//	{
//		this.con.clear();
//		this.con.add(con);
//	}
//
//
//	@Override
//	public List<Constraint> getConstraint()
//	{
//		return con;
//	}
//
//
//	@Override
//	public void setConstraint(List<Constraint> con)
//	{
//		this.con = con;		
//	}
}


/**
 * TODO :
 * wczytywanie z pliku
 * wczytane dane trafiają do tymczasowej bazy sqlite
 * dla mybatisa mapper.xml :
 *   - instrukcje do tworzenia tabeli o nazwie zdefiniowanej w źródle,
 *   - sparametryzowana instrukcja wstawiania 
 */












